package pe.gob.mininter.dirandro.vaadin.panel.informe;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import pe.gob.mininter.dirandro.model.Dependencia;
import pe.gob.mininter.dirandro.model.Informe;
import pe.gob.mininter.dirandro.model.Notificacion;
import pe.gob.mininter.dirandro.service.DependenciaService;
import pe.gob.mininter.dirandro.service.NotificacionService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.PopupDateField;
import com.vaadin.ui.Table;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

@SuppressWarnings("serial")
public class PanelRegistroInformeNotificacion extends CustomComponent implements ClickListener{

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlPrincipal;
	@AutoGenerated
	private Table tblNotificacion;
	@AutoGenerated
	private Button btnGuardar;
	@AutoGenerated
	private HorizontalLayout lytFormulario3;
	@AutoGenerated
	private ComboBoxLOVS cmbEstadoNotificacion;
	@AutoGenerated
	private Label lblEstadoNotificacion;
	@AutoGenerated
	private PopupDateField dtFechaPlazo;
	@AutoGenerated
	private Label lblFechaPlazo;
	@AutoGenerated
	private HorizontalLayout lytFormulario2;
	@AutoGenerated
	private PopupDateField dtFechaVencimiento;
	@AutoGenerated
	private Label lblFechaVencimiento;
	@AutoGenerated
	private PopupDateField dtFechaRecepcion;
	@AutoGenerated
	private Label lblFechaRecepcion;
	@AutoGenerated
	private HorizontalLayout lytFormulario1;
	@AutoGenerated
	private ComboBoxLOVS cmbTipoNotificacion;
	@AutoGenerated
	private Label lblTipoNotificacion;
	@AutoGenerated
	private ComboBox cmbUnidadProcuraduria;
	@AutoGenerated
	private Label lblUnidadProcuraduria;
	
	private NotificacionService notificacionService;
	private DependenciaService dependenciaService;
	
	private Informe informe;
	
	public Informe getInforme() {
		return informe;
	}

	public void setInforme(Informe informe) {
		this.informe = informe;
	}
	
	public static final String COLUMNA_UNIDAD_PROCURADURIA = "unidad_procuraduria";
	public static final String COLUMNA_TIPO_NOTIFICACION = "tipo_notificacion";
	public static final String COLUMNA_FECHA_RECEPCION = "fecha_recepcion";
	public static final String COLUMNA_FECHA_VENCIMIENTO = "fecha_vencimiento";
	public static final String COLUMNA_FECHA_PLAZO = "fecha_plazo";
	public static final String COLUMNA_ESTADO_NOTIFICACION = "estado_notificacion";
	public static final String COLUMNA_OPCION_ELIMINAR = "eliminar";
	public static final String COLUMNA_OPCION_SEGUIMIENTO = "seguimiento";
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */
	public PanelRegistroInformeNotificacion() {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		notificacionService=Injector.obtenerServicio(NotificacionService.class);
		dependenciaService=Injector.obtenerServicio(DependenciaService.class);
		postConstruct();
	}

	public void postConstruct() {
		
		cmbTipoNotificacion.setCodigoLista(Constante.LISTA.CODIGO.TIPO_NOTI);
		cmbTipoNotificacion.setInputPrompt("Tipo Notificacion");

		cmbEstadoNotificacion.setCodigoLista(Constante.LISTA.CODIGO.ESTADO_NOTI);
		cmbEstadoNotificacion.setInputPrompt("Estado Notificacion");
		
		List<Dependencia> dependencias = dependenciaService.buscar(null);
		
		BeanItemContainer<Dependencia> containerDependencia = new BeanItemContainer<Dependencia>(Dependencia.class,  dependencias);
		cmbUnidadProcuraduria.setContainerDataSource(containerDependencia);
		cmbUnidadProcuraduria.setItemCaptionPropertyId("nombre");
		cmbUnidadProcuraduria.setInputPrompt("Unidad Procuraduria");
		
		dtFechaRecepcion.setInputPrompt("Fecha Recepcion Notificacion");
		dtFechaVencimiento.setInputPrompt("Fecha Vencimiento PRI");
		dtFechaPlazo.setInputPrompt("Fecha Plazo Fundamentar");
		
		btnGuardar.addListener(this);
	
		cargarDatos();
		
	}
	
	private void limpiar(){
		cmbUnidadProcuraduria.setValue(null);
		cmbTipoNotificacion.setValue(null);
		dtFechaRecepcion.setValue(null);
		dtFechaVencimiento.setValue(null);
		dtFechaPlazo.setValue(null);
		cmbEstadoNotificacion.setValue(null);
	}
	
	private void cargarDatos(){
		Notificacion notificacionBuscar=new Notificacion();
		notificacionBuscar.setInforme(informe);
		List<Notificacion> notificaciones=notificacionService.buscar(notificacionBuscar);
		
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty(COLUMNA_UNIDAD_PROCURADURIA, String.class,  null);
        container.addContainerProperty(COLUMNA_TIPO_NOTIFICACION, String.class,  null);
        container.addContainerProperty(COLUMNA_FECHA_RECEPCION, String.class,  null);
        container.addContainerProperty(COLUMNA_FECHA_VENCIMIENTO, String.class,  null);
        container.addContainerProperty(COLUMNA_FECHA_PLAZO, String.class,  null);
        container.addContainerProperty(COLUMNA_ESTADO_NOTIFICACION, String.class,  null);
        container.addContainerProperty(COLUMNA_OPCION_ELIMINAR, Button.class,  null);
        container.addContainerProperty(COLUMNA_OPCION_SEGUIMIENTO, Button.class,  null);
        
        DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
        
        int con=1;
		for (final Notificacion notificacion : notificaciones) {
			Item item=container.addItem(con++);
			item.getItemProperty(COLUMNA_UNIDAD_PROCURADURIA).setValue(notificacion.getUnidad()==null?null:notificacion.getUnidad().getNombre());
			item.getItemProperty(COLUMNA_TIPO_NOTIFICACION).setValue(notificacion.getTipoNotificacion()==null?null:notificacion.getTipoNotificacion().getNombre());
			item.getItemProperty(COLUMNA_FECHA_RECEPCION).setValue(notificacion.getFechaRecepcion()==null?null:df.format(notificacion.getFechaRecepcion()));
			item.getItemProperty(COLUMNA_FECHA_VENCIMIENTO).setValue(notificacion.getFechaVencimiento()==null?null:df.format(notificacion.getFechaVencimiento()));
			item.getItemProperty(COLUMNA_FECHA_PLAZO).setValue(notificacion.getFechaPlazo()==null?null:df.format(notificacion.getFechaPlazo()));
			item.getItemProperty(COLUMNA_ESTADO_NOTIFICACION).setValue(notificacion.getEstado()==null?null:notificacion.getEstado().getNombre());
			Button eliminar=new Button();
			eliminar.setCaption("Eliminar");
			eliminar.addListener(new ClickListener() {
				
				@Override
				public void buttonClick(ClickEvent event) {
					notificacionService.eliminar(notificacion);
					cargarDatos();
				}
			});
			item.getItemProperty(COLUMNA_OPCION_ELIMINAR).
			setValue(eliminar);
			Button seguimiento=new Button();
			seguimiento.setCaption("Seguimiento");
			seguimiento.addListener(new ClickListener() {
				
				@Override
				public void buttonClick(ClickEvent event) {
					
					PanelRegistroInformeSeguimientoNotificacion panelRegistroInformeSeguimientoNotificacion=new PanelRegistroInformeSeguimientoNotificacion(notificacion);
					
					Window wdSeguimiento = new Window();
					
					wdSeguimiento.setModal(true);
					wdSeguimiento.setResizable(false);
					wdSeguimiento.addComponent(panelRegistroInformeSeguimientoNotificacion);
						
					wdSeguimiento.setCaption("Seguimiento");
					wdSeguimiento.setWidth("1050px");
					getApplication().getMainWindow().getWindow().addWindow(wdSeguimiento);
				}
			});
			item.getItemProperty(COLUMNA_OPCION_SEGUIMIENTO).
			setValue(seguimiento);
		}
        
        tblNotificacion.setContainerDataSource(container);
        tblNotificacion.setVisibleColumns(new Object[]{COLUMNA_UNIDAD_PROCURADURIA, 
        		COLUMNA_TIPO_NOTIFICACION, COLUMNA_FECHA_RECEPCION, 
        		COLUMNA_FECHA_VENCIMIENTO, COLUMNA_FECHA_PLAZO,
        		COLUMNA_ESTADO_NOTIFICACION, COLUMNA_OPCION_ELIMINAR, COLUMNA_OPCION_SEGUIMIENTO});
        tblNotificacion.setColumnWidth(COLUMNA_UNIDAD_PROCURADURIA, 100);
        tblNotificacion.setColumnWidth(COLUMNA_TIPO_NOTIFICACION, 100);
        tblNotificacion.setColumnWidth(COLUMNA_FECHA_RECEPCION, 100);
        tblNotificacion.setColumnWidth(COLUMNA_FECHA_VENCIMIENTO, 100);
        tblNotificacion.setColumnWidth(COLUMNA_FECHA_PLAZO, 100);
        tblNotificacion.setColumnWidth(COLUMNA_ESTADO_NOTIFICACION, 100);
        tblNotificacion.setColumnWidth(COLUMNA_OPCION_ELIMINAR, 100);
        tblNotificacion.setColumnWidth(COLUMNA_OPCION_SEGUIMIENTO, 100);
        tblNotificacion.setColumnHeader(COLUMNA_UNIDAD_PROCURADURIA, "Unidad");
        tblNotificacion.setColumnHeader(COLUMNA_TIPO_NOTIFICACION, "Tipo");
        tblNotificacion.setColumnHeader(COLUMNA_FECHA_RECEPCION, "F. Recepcion");
        tblNotificacion.setColumnHeader(COLUMNA_FECHA_VENCIMIENTO, "F. Vencimiento");
        tblNotificacion.setColumnHeader(COLUMNA_FECHA_PLAZO, "F. Plazo");
        tblNotificacion.setColumnHeader(COLUMNA_ESTADO_NOTIFICACION, "Estado");
        tblNotificacion.setColumnHeader(COLUMNA_OPCION_ELIMINAR, "");
        tblNotificacion.setColumnHeader(COLUMNA_OPCION_SEGUIMIENTO, "");
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals(btnGuardar)){
			Notificacion notificacion=new Notificacion();
			notificacion.setInforme(informe);
			notificacion.setUnidad((Dependencia)cmbUnidadProcuraduria.getValue());
			notificacion.setTipoNotificacion(cmbTipoNotificacion.getValor());
			notificacion.setFechaRecepcion((Date)dtFechaRecepcion.getValue());
			notificacion.setFechaVencimiento((Date)dtFechaVencimiento.getValue());
			notificacion.setFechaPlazo((Date)dtFechaPlazo.getValue());
			notificacion.setEstado(cmbEstadoNotificacion.getValor());
			
			AlertDialog alertDialog = null;
			if(notificacion.esNuevo()){
				notificacionService.crear(notificacion);
				alertDialog = new  AlertDialog("Registro de Notificación", "Se ha registrado la notificación correctamente", "Aceptar", "400");
			}else{
				notificacionService.actualizar(notificacion);
				alertDialog = new  AlertDialog("Registro de Notificación", "Se ha actualizado la notificación correctamente", "Aceptar", "400");
			}
			getApplication().getMainWindow().addWindow(alertDialog);
			limpiar();
			cargarDatos();
		}
	}
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new VerticalLayout();
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(false);
		pnlPrincipal.setSpacing(true);
		
		// lytFormulario1
		lytFormulario1 = buildLytFormulario1();
		pnlPrincipal.addComponent(lytFormulario1);
		
		// lytFormulario2
		lytFormulario2 = buildLytFormulario2();
		pnlPrincipal.addComponent(lytFormulario2);
		
		// lytFormulario3
		lytFormulario3 = buildLytFormulario3();
		pnlPrincipal.addComponent(lytFormulario3);
		
		// btnGuardar
		btnGuardar = new Button();
		btnGuardar.setCaption("Agregar");
		btnGuardar.setImmediate(true);
		btnGuardar.setWidth("-1px");
		btnGuardar.setHeight("-1px");
		pnlPrincipal.addComponent(btnGuardar);
		pnlPrincipal.setComponentAlignment(btnGuardar, new Alignment(20));
		
		// tblNotificacion
		tblNotificacion = new Table();
		tblNotificacion.setImmediate(false);
		tblNotificacion.setWidth("940px");
		tblNotificacion.setHeight("200px");
		pnlPrincipal.addComponent(tblNotificacion);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario1() {
		// common part: create layout
		lytFormulario1 = new HorizontalLayout();
		lytFormulario1.setImmediate(false);
		lytFormulario1.setWidth("-1px");
		lytFormulario1.setHeight("-1px");
		lytFormulario1.setMargin(false);
		lytFormulario1.setSpacing(true);
		
		// lblUnidadProcuraduria
		lblUnidadProcuraduria = new Label();
		lblUnidadProcuraduria.setImmediate(false);
		lblUnidadProcuraduria.setWidth("160px");
		lblUnidadProcuraduria.setHeight("-1px");
		lblUnidadProcuraduria.setValue("Unidad Procuraduria");
		lytFormulario1.addComponent(lblUnidadProcuraduria);
		
		// cmbUnidadProcuraduria
		cmbUnidadProcuraduria = new ComboBox();
		cmbUnidadProcuraduria.setImmediate(false);
		cmbUnidadProcuraduria.setWidth("150px");
		cmbUnidadProcuraduria.setHeight("-1px");
		lytFormulario1.addComponent(cmbUnidadProcuraduria);
		
		// lblTipoNotificacion
		lblTipoNotificacion = new Label();
		lblTipoNotificacion.setImmediate(false);
		lblTipoNotificacion.setWidth("160px");
		lblTipoNotificacion.setHeight("-1px");
		lblTipoNotificacion.setValue("Tipo Notificacion");
		lytFormulario1.addComponent(lblTipoNotificacion);
		
		// cmbTipoNotificacion
		cmbTipoNotificacion = new ComboBoxLOVS();
		cmbTipoNotificacion.setImmediate(false);
		cmbTipoNotificacion.setWidth("150px");
		cmbTipoNotificacion.setHeight("-1px");
		lytFormulario1.addComponent(cmbTipoNotificacion);
		
		return lytFormulario1;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario2() {
		// common part: create layout
		lytFormulario2 = new HorizontalLayout();
		lytFormulario2.setImmediate(false);
		lytFormulario2.setWidth("-1px");
		lytFormulario2.setHeight("-1px");
		lytFormulario2.setMargin(false);
		lytFormulario2.setSpacing(true);
		
		// lblFechaRecepcion
		lblFechaRecepcion = new Label();
		lblFechaRecepcion.setImmediate(false);
		lblFechaRecepcion.setWidth("160px");
		lblFechaRecepcion.setHeight("-1px");
		lblFechaRecepcion.setValue("Fecha Recepcion Notificacion");
		lytFormulario2.addComponent(lblFechaRecepcion);
		
		// dtFechaRecepcion
		dtFechaRecepcion = new PopupDateField();
		dtFechaRecepcion.setImmediate(false);
		dtFechaRecepcion.setWidth("150px");
		dtFechaRecepcion.setHeight("-1px");
		dtFechaRecepcion.setResolution(4);
		lytFormulario2.addComponent(dtFechaRecepcion);
		
		// lblFechaVencimiento
		lblFechaVencimiento = new Label();
		lblFechaVencimiento.setImmediate(false);
		lblFechaVencimiento.setWidth("160px");
		lblFechaVencimiento.setHeight("-1px");
		lblFechaVencimiento.setValue("Fecha Vencimiento PRI");
		lytFormulario2.addComponent(lblFechaVencimiento);
		
		// dtFechaVencimiento
		dtFechaVencimiento = new PopupDateField();
		dtFechaVencimiento.setImmediate(false);
		dtFechaVencimiento.setWidth("150px");
		dtFechaVencimiento.setHeight("-1px");
		dtFechaVencimiento.setResolution(4);
		lytFormulario2.addComponent(dtFechaVencimiento);
		
		return lytFormulario2;
	}

	@AutoGenerated
	private HorizontalLayout buildLytFormulario3() {
		// common part: create layout
		lytFormulario3 = new HorizontalLayout();
		lytFormulario3.setImmediate(false);
		lytFormulario3.setWidth("-1px");
		lytFormulario3.setHeight("-1px");
		lytFormulario3.setMargin(false);
		lytFormulario3.setSpacing(true);
		
		// lblFechaPlazo
		lblFechaPlazo = new Label();
		lblFechaPlazo.setImmediate(false);
		lblFechaPlazo.setWidth("160px");
		lblFechaPlazo.setHeight("-1px");
		lblFechaPlazo.setValue("Fecha Plazo Fundamentar");
		lytFormulario3.addComponent(lblFechaPlazo);
		
		// dtFechaPlazo
		dtFechaPlazo = new PopupDateField();
		dtFechaPlazo.setImmediate(false);
		dtFechaPlazo.setWidth("150px");
		dtFechaPlazo.setHeight("-1px");
		dtFechaPlazo.setResolution(4);
		lytFormulario3.addComponent(dtFechaPlazo);
		
		// lblEstadoNotificacion
		lblEstadoNotificacion = new Label();
		lblEstadoNotificacion.setImmediate(false);
		lblEstadoNotificacion.setWidth("160px");
		lblEstadoNotificacion.setHeight("-1px");
		lblEstadoNotificacion.setValue("Estado Notificacion");
		lytFormulario3.addComponent(lblEstadoNotificacion);
		
		// cmbEstadoNotificacion
		cmbEstadoNotificacion = new ComboBoxLOVS();
		cmbEstadoNotificacion.setImmediate(false);
		cmbEstadoNotificacion.setWidth("150px");
		cmbEstadoNotificacion.setHeight("-1px");
		lytFormulario3.addComponent(cmbEstadoNotificacion);
		
		return lytFormulario3;
	}

}
